Объясню, почему я удалил код: после проведённого за кодом времени, я понял, что сильно погорячился, задав такой глупый вопрос. Стоило отдохнуть, проветрить голову, и решение нашлось. Тем, кто столкнулся с хоть самую малость, но похожей проблемой, дам совет: всегда проверяйте соответствия заклинаний, написанных в коде jass (CTRL + D, если кто не знает, как узнать id заклинания) и ,конечно, сам синтаксис. Также посоветую не утраивать "свалку" в коде, как это сделал я. В общем, если кому интересно, как я решил проблему, пишите - расскажу или даже помогу если у вас она схожая.(Всё дело во внимательности)...
Сброшу код триггера таким, каким я его хотел видеть изначально:
function MU_Check_lvl_four takes nothing returns boolean
if ( not ( GetUnitAbilityLevelSwapped('A011', udg_Akame_Killer) == 4 ) ) then
return false
endif
return true
endfunction
function MU_Check_lvl_three takes nothing returns boolean
if ( not ( GetUnitAbilityLevelSwapped('A011', udg_Akame_Killer) == 3 ) ) then
return false
endif
return true
endfunction
function MU_Check_lvl_two takes nothing returns boolean
if ( not ( GetUnitAbilityLevelSwapped('A011', udg_Akame_Killer) == 2 ) ) then
return false
endif
return true
endfunction
function MU_Check_lvl_one takes nothing returns boolean
if ( not ( GetUnitAbilityLevelSwapped('A011', udg_Akame_Killer) == 1 ) ) then
return false
endif
return true
endfunction
function MU_Second_Conditions takes nothing returns boolean
if ( not ( UnitHasBuffBJ(GetEventDamageSource(), 'B008') == true ) ) then
return false
endif
if ( not ( GetEventDamageSource() == udg_Akame_Killer ) ) then
return false
endif
return true
endfunction
function MU_Start_Conditions takes nothing returns boolean
if ( not ( UnitHasBuffBJ(GetAttacker(), 'B008') == true ) ) then
return false
endif
if ( not ( GetAttacker() == udg_Akame_Killer ) ) then
return false
endif
return true
endfunction
function Trig_MU_Conditions takes nothing returns boolean
if ( not MU_Start_Conditions() ) then
return false
endif
return true
endfunction
function MU_Venum_Check takes nothing returns boolean
if ( not ( udg_MU_Venum_counter == 2 ) ) then
return false
endif
return true
endfunction
function MU_del takes nothing returns nothing
if ( MU_Check_lvl_one() ) then
call SetPlayerAbilityAvailableBJ( true, 'A00X', GetOwningPlayer(GetEventDamageSource()) )
call UnitRemoveAbilityBJ( 'A00X', GetEventDamageSource() )
else
if ( MU_Check_lvl_two() ) then
call SetPlayerAbilityAvailableBJ( true, 'A00U', GetOwningPlayer(GetEventDamageSource()) )
call UnitRemoveAbilityBJ( 'A00U', GetEventDamageSource() )
else
if ( MU_Check_lvl_three() ) then
call SetPlayerAbilityAvailableBJ( true, 'A00Y', GetOwningPlayer(GetEventDamageSource()) )
call UnitRemoveAbilityBJ( 'A00Y', GetEventDamageSource() )
else
if ( MU_Check_lvl_four() ) then
call SetPlayerAbilityAvailableBJ( true, 'A013', GetOwningPlayer(GetEventDamageSource()) )
call UnitRemoveAbilityBJ( 'A013', GetEventDamageSource() )
else
call DoNothing( )
endif
endif
endif
endif
endfunction
function Trig_MU_Actions takes nothing returns nothing
call DestroyTrigger(udg_MU_trig)
set udg_MU_Venum_counter = GetRandomInt(1, 5)
set udg_MU_TG = GetAttackedUnitBJ()
if ( MU_Venum_Check() ) then
if ( MU_Check_lvl_one() ) then
call UnitAddAbilityBJ( 'A00X', udg_Akame_Killer )
call SetPlayerAbilityAvailableBJ( false, 'A00X', GetOwningPlayer(udg_Akame_Killer) )
else
if ( MU_Check_lvl_two() ) then
call UnitAddAbilityBJ( 'A00U', udg_Akame_Killer )
call SetPlayerAbilityAvailableBJ( false, 'A00U', GetOwningPlayer(udg_Akame_Killer) )
else
if ( MU_Check_lvl_three() ) then
call UnitAddAbilityBJ( 'A00Y', udg_Akame_Killer )
call SetPlayerAbilityAvailableBJ( false, 'A00Y', GetOwningPlayer(udg_Akame_Killer) )
else
if ( MU_Check_lvl_four() ) then
call UnitAddAbilityBJ( 'A013', udg_Akame_Killer )
call SetPlayerAbilityAvailableBJ( false, 'A013', GetOwningPlayer(udg_Akame_Killer) )
else
call DoNothing( )
endif
endif
endif
endif
set udg_MU_trig = CreateTrigger()
call TriggerRegisterUnitEvent( udg_MU_trig, udg_MU_TG, EVENT_UNIT_DAMAGED )
call TriggerAddCondition( udg_MU_trig, Condition( function MU_Second_Conditions ) )
call TriggerAddAction( udg_MU_trig, function MU_del )
else
call DoNothing( )
endif
endfunction
//===========================================================================
function InitTrig_MU takes nothing returns nothing
set gg_trg_MU = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_MU, EVENT_PLAYER_UNIT_ATTACKED )
call TriggerAddCondition( gg_trg_MU, Condition( function Trig_MU_Conditions ) )
call TriggerAddAction( gg_trg_MU, function Trig_MU_Actions )
endfunction
Суть триггера:
Имеется способность с четырьмя уровнями. На каждом уровне урон способности разный, а шанс срабатывания всегда 25%. При атаке герой, имеющий такую способность имеет шанс (25%) на отравление противника.
Переменная udg_Akame_killer равносильна GetEventDamageSource()
P.S. Возможно кому-то даже пригодится этот код... Сделан полнейшим неумехой в плане jass, так что не судите строго!
Пока нет желания разбираться, что у тебя так, а что не так. Но вижу, что переменная Window не назначена окну, а ещё как бы создаются в цикле одновременно 10 окон, которые потом все одновременно ждут 50 секунд. Вот скрин действий триггера вместо двух твоих, секунда ожидания поставлена для того, чтобы увидеть пропадание окна таймера.
Довольно тяжело в этом разобраться, ты думаешь о том, что тебе нужно, но не всё договариваешь, а залезть в твою голову не могу. Во-первых, нумерация массива начинается с 0, то есть размерность переменной 1 представляет два массива - переменная[0] и переменная[1], но у тебя переменная[0] вроде не задействована. Во-вторых, на первом скрине у тебя цикл по А от 2 до 10, а в пояснении пишешь, что стандартные резолюции с 1 по 8, но в таком случае обработка идёт с 1 по 9 для А-1. Ошибка ли это, либо дальше 9 иначе обрабатывается, непонятно, скрин обрезан. В-третьих, хотя не уверен, что проблема в этом, но может быть обработку остальных действий вызывает очистка диалога, попробуй переместить If/Then/Else первой кнопки в самый низ, чтобы очистка диалога срабатывала последней. В-четвёртых, создание юнита создаёт утечку группы, надо после этого действия удалять последнюю созданную группу.
Вроде такой custom script: call DestroyGroup(Last Created Unit Group).
Баг абилки
исправляется с помощью тригга - добавляем анимационный таг, счетчик для количества ударов и даем руну на морф с другим типом атаки\бонус к урону\...
само собой абилку заменяем другой, можно на основе канала
Причина: причин было много, а я искал лишь одну
Самыми распространёнными оказались элементарные ошибки в коде, отсутствие параметров, параметры не того типа данных (привет динамическая типизация) или лишние параметры, из за чего происходили "рандомные рассинхроны при обрыве потока"
Огромное спасибо пользователю prog, что откликнулся и смог найти ошибки, а нашёл он их при помощи языкового сервера sumneko lua для VScode
Читал новое пользовательские соглашение? Потом разжевывали на одной из тем по патчам рефорджа. Близзарды перестраховались, и теперь низя в карту контент пихать, который не твой или свободно распростроняемый, в противном случае хоть 1 жалоба на твою карту - бан, любой мудак которому че-то не понравится может написать близардам, они не будут разбираться он хозяин контента или нет.
Правообладатели нарут и прочих аниме прав тебе никогда не дадут, даже разговаривать не будут, только юр. Лицаи только много денег, бомжи вроде нас с тобой им не интересны. Но при этом за спасибо тебе никто не даст прав делать карту в которой все бы бесплатно играли.
Лучший способ избежать потери информации ввиду такого рода глюков в будущем - это регулярное создание резервных копий. Желательно одновременно на компьютере (в архиве .7z, чтобы избежать разного рода "авто-детектов" наподобие того, который использует рефандед при деинсталляции) и еще где-нибудь, к примеру, на яндекс диске, или на внешнем жестком диске. А еще лучше, если этих "где-нибудь" несколько. К примеру, мой варкрафт 1.26 лежит на всех доступных мне внешних носителях информации, обладающих достаточной вместимостью. И потерять и его могу, только если они все навернутся одновременно.
А группы в массиве CreepsGroup созданы? Нужно либо создавать группы при инициализации, проходясь циклом по массиву, либо в константах указать "размер" массива, и тогда они будут сами созданы. То есть нужно 12 групп -- ставишь размер 12, группы будут созданы в ячейках с 0 по 11.
если ты создаешь нейтрально-враждебных то нужно им в игровых константах менять значения
пошамань с этими значениями и все норм будет, ну а если у тебя монстры под контролем других игроков а не нейтралов, то тогда не знаю даже
guard distance - это расстояние на котором крипы агряться
guard return distance - это на какое расстояние мобы могут отходить от место их создания, если они отошли на 1000 они возвращаются обратно
guard return time - типо тоже самое что с расстоянием, только время
Видимо єта кнопка тесно спряжена с более низкими слоями игры (чит. "hardcoded"). Похоже, что скрыть её нельзя. Я могу только посоветовать вернуться назад и посмотреть, что можно сделать по-другому, чтобы не приходилось скрывать кнопку.
Порыть там надо, во всяком случае стандартные приказы, иконки и клавиши к ним там прописаны.
(естесственно нужно импоритровать эти изменённые файлики в карту)
Я пробовал прописывать кнопке неадекватные значения позиции кнопки и пиктограммы, но ничего не вышло — игра подставляет свои значения.
да сделать такое можно...
при использовании способности "звездопад"... создаём даммика которому приказываем использовать предметную способность распространения порчи...
Лимит операций, обычно это беда настигает заядлых гуишников.
На jass обычно нету таких проблем.
Создайте таймер с периодом .00 сек и запускайте им функции инициализации триггеров.
функция типа InitTrig_Имя триггера - это функция инициализации триггера, она вызывается из функции InitCustomTriggers, но если этих вызовов очень много то функция упирается в лимит операций и поток завершается так и не создав все триггеры.
ну редактор тебе ведь написал, что файл поврежден. если даже он работает в игре, это еще не значит, что с ним все в порядке.
если же эдитор на все подряд ругается - другое дело, снести и поставить опять
Редактор ландшафта -> Файл -> Экспортировать скрипт карты. Пишешь небольшой парсер, который отсекает всё до первого триггера, затем каждый триггер в отдельный файл, затем всё после последнего триггера в отдельный файл.
в качестве параметра Condition должна быть функция которая takes nothing returns boolean
для ForGroupBJ должна быть функция takes nothing returns nothing
смотри гуишные примеры и читай статьи
с погоней всё легко(если ты конечно не хочешь чтобы аи прошёл Тест Тьюринга)
если юнит врага видим то запоминаем его координаты и идём к нему
если юнит врага исчез из области видимости (ушёл в туман/инвиз) то идём к последнему местонахождению врага(наши запомненные координаты)
стоит совместить это с проверкой на смерть цели погони(чтобы не бежать к трупу) и с проверкой на угрозу (чтобы не залезть под фонтан случайно)
добавить кода и специй по вкусу
А что мешает поставить время жизни 0 сек, тогда у него не будет таймера жизни и он не помрет по истечению времени.
Используя событие - юнит призвал юнита, можно установить желаемое время жизни призванного юнита.
Ну тот же огненный дождь, там можно настроить лимит урона на волну, а так же настроить урон от горения, т.е на врагах появляется дебафф который их жжет несколько секунд. Ну еще можно абилку огенный голем, в версии где может упасть несколько големов с интервалом, вместо эффекта падения голема сделай эффект землетрясения, а вместо големов щупальца, типо из под землю вылазят. Правда оглушать будет.
Конечно не кастуют, ии получает приоритет исходя из того кто большее всех дерется, кто напал или убивает союзника тот и есть наиболее подходящая цель.
Триггерно проверять нет ли в пределах досигаймости юнита без баффа, если есть то пытатся кастануть в него некоторый скилл - к примеру проклятие банши.
SaveUnitHandle(hash,GetHandleId(target),7,caster);
GetHandleId(target) - хендл самого юнита
LoadUnitHandle(hash,GetUnitTypeId(u),7);
GetUnitTypeId(u) - Ид типа юнита, а не хендл.
Если юнит под баффом "чума" - добавить в отряд Чума
Иначе - удалить из отряда Чума
Триггер
С. Таймер Чума
Отряд выбрать юнитов Чума
Если юнит умер
Д. создать юнита в позиции выбранного юнита.
dave_wwid, уже заметил что даная проблема происходит после сжатия модели стандартными функциями в mdlvis. Нашел лично для себя альтернативу так что вопрос закрываю.
Файл карты - это архив, где содержатся файлы с данными о ландшафте, тенях, юнитах, триггерах и прочего этой карты. Бегло посмотрел пустую карту и насколько понял, за ландшафт отвечают три самых больших файла: в одном содержится информация о текстурах тайлов, в другом о тенях на тайлах, в третьем либо о проходимости, либо о высотах ландшафта. Может быть ещё где-то хранится информация, но не суть. Файл с данными о тенях war3map.shd можно удалить, при сохранении редактор его создаст заново, а вот два других файла war3map.w3e и war3map.wpm нужно аккуратно увеличить, копируя данные внутри них. Только, как отметил Jack-of-shadow, есть лимит у редактора и игры. Не факт, что редактор вообще откроет, а потом сохранит такую большую карту. Если всё-таки хочешь попытаться, то качай:
И тренируйся сперва сделать с помощью этого из карты 32х32 карту 64х64, как получится, можно из 256х256 попытаться сделать 512х512. Если с ней не будет проблем, то можно продолжать.
P. S. Stason888045:
У меня абсолютно нет никаких навыков даже в элементарном программировании, разобрать прогу или игру самому - не осилю ни за что.
А как триггеры делаешь? Как раз элементарное программирование.
20 - 30 к разрушаемых объектов, главное что бы у них не стояло галочки "можно пройти". А вот то что в кадре, это уже другое ограничение. Это зависит от полигонажа моделей. Кажется больше 60 тысяч полигонов в кадре начинают плясать. Анимация сама по себе не на что не повлияет, а вот кол-во костей возможно. но 2-3 на каждый куст вполне можно.
А если кодом, то мелкую траву можно вообще спавнить как спецефекты.
1.Либо в точки где тлайсет раскрашен травой.
2.Можно расставить в редакторе, как декорации, а потом получить список в *doo. И блокнотиком зареплейсить, на эфекты.
Файл карты - это архив, где содержатся файлы с данными о ландшафте, тенях, юнитах, триггерах и прочего этой карты. Бегло посмотрел пустую карту и насколько понял, за ландшафт отвечают три самых больших файла: в одном содержится информация о текстурах тайлов, в другом о тенях на тайлах, в третьем либо о проходимости, либо о высотах ландшафта. Может быть ещё где-то хранится информация, но не суть. Файл с данными о тенях war3map.shd можно удалить, при сохранении редактор его создаст заново, а вот два других файла war3map.w3e и war3map.wpm нужно аккуратно увеличить, копируя данные внутри них. Только, как отметил Jack-of-shadow, есть лимит у редактора и игры. Не факт, что редактор вообще откроет, а потом сохранит такую большую карту. Если всё-таки хочешь попытаться, то качай:
И тренируйся сперва сделать с помощью этого из карты 32х32 карту 64х64, как получится, можно из 256х256 попытаться сделать 512х512. Если с ней не будет проблем, то можно продолжать.
P. S. Stason888045:
У меня абсолютно нет никаких навыков даже в элементарном программировании, разобрать прогу или игру самому - не осилю ни за что.
А как триггеры делаешь? Как раз элементарное программирование.
Итак, спустя 30 часов тестов по 10 минут каждый я нашел проблему.
После 10 минуты при юза огненного столба (его юзали компы, если не я) зависает варкрафт. РЕФАНДЕД спасибо! Инфа сотка, такая проблема оказалась не только у меня в проекте.
Спасибо всем, кто пытался помочь, вы лучшие! :)
Тема закрыта.
Melissa, Короче я разобрался - все проблемы были из-за переменной Total_Num_Players, она была подбита под живых игроков, а так как я был единственным живым игроком, то давала строку равную 1 (то есть 0+1 я). В общем спасибо, не додумал бы без твоей помощи до своей ошибки(у тебя ведь создаётся по заданому числу количество строк).
Короче, так как не разобрался, то сделал пока костыль. Герой этот использует анимацию Spell лишь для этой способности, потому прописал звук появления прямо в модель героя, ну а звук исчезновения у эффекта всё равно работает.
» WarCraft 3 / Помощ с условием
» WarCraft 3 / урон деревьям
» WarCraft 3 / Warcraft 3 Reforged. Модели
» WarCraft 3 / Проблемы с работой триггеров
» WarCraft 3 / Как скрыть кнопку строительства?
» WarCraft 3 / Объединение способностей
» WarCraft 3 / Как сделать геройское свечение?
» WarCraft 3 / Крашится модель
» WarCraft 3 / Редактор кода
» WarCraft 3 / общий вопрос про jass
» WarCraft 3 / Редакторы карт WarCraft 3
» WarCraft 3 / помогите вспомнить карту
» WarCraft 3 / Враг на миникарте
» WarCraft 3 / Как изменить условие наоборот?
» WarCraft 3 / Не открывается мапа
» WarCraft 3 / огненный дождь.
» WarCraft 3 / Паразит.
» WarCraft 3 / Превращение в зомби.
» WarCraft 3 / Ошибка в редакторе моделей
» WarCraft 3 / Какой лимит размера карты?
» WarCraft 3 / Особый удар
» WarCraft 3 / Нужна помощь мультиборд
» WarCraft 3 / Исчезновение звука
» WarCraft 3 / гнев деревьев (корни)
» WarCraft 3 / Как отследить улучшения зданий?